﻿#define _CRT_SECURE_NO_WARNINGS 1

/*给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
输入：nums = [0,0,1,1,1,2,2,3,3,4]
输出：5, nums = [0,1,2,3,4]
解释：函数应该返回新的长度 5 ， 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。*/

int removeDuplicates(int* nums, int numsSize)
{
    int src1 = 0;//标记前一个元素位置
    int src2 = 1;//标记后一个元素位置
    int dst = 0; //覆盖原来数组的位置
    while (src2 < numsSize)//src2是后面元素的位置，不能越界访问
    {
        nums[dst++] = nums[src1];//每次都记录不重复的元素
        if (nums[src1] != nums[src2])//不相同，继续向后查找
        {
            ++src1;
            ++src2;
        }
        else                       //相同，就去查找下一个不同的元素
        {
            while ((src2 < numsSize) && (nums[src1] == nums[src2]))
            {
                ++src2;
            }
            src1 = src2;//给前一个位置的指针
            ++src2;    //向后继续找     
        }
    }
    if (src1 < numsSize) //最后可能src2已经到了最后元素的下一个位置，src1没写进数组，把src1位置的元素放进数组
    {
        nums[dst++] = nums[src1];
    }
    return dst;
}

/*给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。*/

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{

    int i = 0;
    int src1 = 0;
    int src2 = 0;
    while ((src1 < m) && (src2 < n))
    {
        int a = m;
        if (nums1[src1] < nums2[src2])
        {
            src1++;
        }
        else
        {
            while (a > src1)
            {
                nums1[a] = nums1[a - 1];
                a--;
            }
            nums1[src1] = nums2[src2];
            src2++;
            src1++;
            m++;
        }

    }

        if (src1 == m)
        {
            while (src2 < n)
            {
                nums1[src1] = nums2[src2];
                src2++;
                src1++;
            }
        }

}

/*void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
        int end1=m-1;
        int end2=n-1;
        int end=n+m-1;
    while((end2>=0)&&(end1>=0))
    {
        if(nums1[end1]<nums2[end2])
                {
                nums1[end--]=nums2[end2--]; 
                }
                else
                {
                    nums1[end--]=nums1[end1--];
                }
    }
    while(end2>=0)
    {
        nums1[end--]=nums2[end2--]; 
    }
            
}*/



